package com.lins;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration //排除配置类(exclude={DataSourceAutoConfiguration.class})
@SpringBootApplication
@MapperScan("com.lins.store.mapper")
@EnableScheduling //启用定时任务的支持
@ServletComponentScan //可通过@WebListener等注解自动注册
public class StoreDiskApplication {

    public static void main(String[] args) {
        SpringApplication.run(StoreDiskApplication.class, args);
    }

//    @Bean
//    public OSS ossClient(){
//        OSS ossClient = new OSSClientBuilder().build(Ali_Info.endpoint, Ali_Info.accessKeyId, Ali_Info.accessKeySecret);
//        return ossClient;
//    }

    /**
     * 当前项目缺陷：
     *  1，文件重命名，OSS端不能同步修改，可能导致预览或下载时找不到。
     *      解决：重命名就是在当前目录下，从源文件名拷贝到新文件名一份，预览或下载时指针是新文件
     *  2，文件移动后，OSS端不能同步移动，会导致预览或下载时找不到。
     *      解决：OSS提供有Copy接口，将source文件拷贝到目标文件后，再访问目标文件时可以访问到。
     *  3，没有OSS端的文件删除，目前只能以覆盖替换。
     *      解决：OSS提供有删除文件的接口，可以优化。
     *  4，如果多个用户在同级目录下创建同文件名的文件，OSS中先创建者的文件会被后创建者的文件覆盖。
     *      解决：(1)上传文件之前从数据库判断同级目录下的重复文件名，重复则不可上传，但会影响用户体验。
     *           (2)给每个注册用户新建一个bucket空间，每个用户的文件只存在自己的空间内。成本高，资源浪费。
     *           (3)给上传的文件标注用户属性用以辨别。
     *  5，网盘的切面：每个接口拿数据都需要使用AOP验证该用户是否存在：
     *      如用户被删除(删除用户时会删除用户文件)，但页面未关闭，session仍然存在，则页面还可以正常加载，并能正常取出共享的内容，这是不合理的。
     *      解决:1,根据AOP切面，给所有接口加入状态验证，在每步操作时都判断该用户状态是否正常。
     *          2,若用户退出登录，没有session时，在请求的入口端添加addInterceptors拦截器，拦截所有没有session的请求。
     *          3,若用户没有退出登录，而是直接被管理员删除账号，则删账号时失效这个用户的session，根据第二条让其被拦截。
     *          注意：Filter和Interceptor都是AOP思想
     */

    /**
     * Content-Type
     *  application/x-www-form-urlencoded：常用@RequestParam(“参数名称”)，也可以不写，使用springMvc默认根据参数名称自动赋值。
     *  multipart/form-data：MultipartFile multiFile 文件
     *  application/json：必须使用@RequestBody，可用Map或Entity接收，
     *  前端在请求参数中设置请求头：header: {"Content-Type": "application/x-www-form-urlencoded"}
     *                        header: {"Content-Type": "application/json"}
     *
     */

}
